אם באתרכם הופיעו סימני שאלה וציורים סיניים במקום עברית, או אם אתם לא יודעים מה זה קידוד (Encoding) או UTF-8, קראו את המדריך הזה וטפלו אחת ולתמיד במושג שנקרא "קידוד".
מה יש לו? למה הוא מציג לי ג'יבריש במקום עברית?
הסיבה לסימני השאלה והג'יבריש האלה טמונה במילה אחת, והיא קידוד. קידוד הוא האופן שבו המחשב שומר אצלו את תווי הטקסט שמהם מורכבת המחרוזת. לפעמים הוא לא כל כך מצליח, ולכן אנחנו צריכים לעזור לו.
מה לי ולקידוד?
הרבה מאוד שפות קיימות בכדור הארץ, וכמעט כל אחת מהן מוצאת את עצמה על גבי מסכי המחשב. בכל שפה אותיות שונות הנראות שונה, נכתבות באופן שונה ויוצרות בעיות שמירה שונות.
בעבר כל תו (אות) נשמר כ-byte (בַּית - יש פה ניקוד, הגדילו את המסך בכדי לראות אותו.) אחד בזכרון. מכיוון שכל byte היה מורכב משמונה bitים (bit, בִּיט - גם פה יש ניקוד.), היו בסה"כ 255 אותיות איתם המחשב ידע לעבוד. לאחר מכן נכנסה להיסטוריה המצאה גאונית שנקראה "קִידוּד". קידוד היה אוסף של 255 אותיות שאיתו המחשב היה עובד.
באחד הקידודים את 255 התווים הללו תפסו אנגלית, רוסית וספרות (cp1251).
קידוד אחר היה מורכב מ-255 תווים שהיו באנגלית, צרפתית וספרות (cp1252).
קידוד נוסף היה אנגלית, עברית וספרות (cp1255).
כל הבעיות מתחילות אם יש לנו מחרוזת שמורכבת מכמה שפות או אם הקידוד הנבחר לא מכיל את האותיות בשפה איתה אנו עובדים. אז מה, אי אפשר לעבוד בשתי שפות?
UTF-8
UTF-8 זהו קידוד שמורכב מיותר מ-byte אחד לתו (בין 1 ל-4 בתים), מה שמרחיב את כמות התווים שהוא מסוגל לשמור. הקידוד מסוגל לשמור תווים של הרבה מאוד שפות, והוא בדיוק מה שאנחנו צריכים.
להגדיר קידוד בחמישה מקומות
1. בקובץ שאיתו אנחנו עובדים
כאן נכנס לפעולה עורך הטקסט שלנו. בכל עורך טקסט אפשר להגדיר את קידוד הקובץ בחלון ההגדרות או בחלון השמירה. ב-Notepad יש את שם הקובץ, מתחתיו סוג הקובץ ומתחתיו קידוד (Encoding), אותו צריך להגדיר כ-"Unicode (UTF-8)". זה נראה כך:
בעת שימוש ב-File Managerים שונים של האחסון שלכם יש להקפיד שהקידוד הוא UTF-8. במספר File Managerים זה נקרא "English UTF-8".
2. ליידע את PHP באיזו שפה הוא מדבר
השורה הראשונה שאמורה להימצא בקוד שלכם מתוך הרגל:
<?php header('Content-Type: text/html; charset=utf-8'); ?>
3. ליידע את הדפדפן באיזה קידוד עליו להציג את הטקסט
כאן עלינו להגדיר תג מטא בתוך דף ה-html (בחלק ה-head) עבור הדפדפן.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ואם אנחנו משתמשים ב-HTML 5:
<meta charset="utf-8" />
4. ליידע את חיבור המסד עם PHP באיזה קידוד עליו להשתמש
כאן יהיה עלינו להגדיר את קידוד ההתחברות אל מסד הנתונים, כדי שהתעבורה בין תוכנת מסד הנתונים והסקריפט שלכם לא תאבד לכם אותיות באמצע.
<?php
$db = mysql_connect('localhost','1','2');
mysql_select_db('mydb',$db);
mysql_query("SET NAMES 'utf8'",$db);
$db = mysql_connect('localhost','1','2');
mysql_select_db('mydb',$db);
mysql_query("SET NAMES 'utf8'",$db);
5. לדאוג שהמסד שומר נתונים בקידוד הנכון
כאשר אנחנו יוצרים טבלה, יש לנו אפשרות להגדיר את הקידוד של כל שדה בטבלה בנפרד. הקידוד שאנחנו רוצים (UTF-8) נקרא utf8_general_ci. יש לבחור בו בעת היצירה, והוא ידאג לתקינות הנתונים שלנו לתמיד.
זהו זה, בעיית הקידוד נפתרה.
יכול להיות שלאחר מעבר ל utf-8 תתקלו בבעיית ה-Can not send session cookie - headers already sent.
תגובות לכתבה:
במידה ו set names לא עזר ובכל זאת נשלפים סימני שאלה מהמסד — אפשר לנסות את הקוד הבא:
mysql_query("set character_set_client='utf8'");
mysql_query("set character_set_results='utf8'");
mysql_query("set collation_connection='utf8'");
x
אם הפעולה הזו עדיין לא תעזור, כנראה שהנתונים הוכנסו בעבר למסד באופן לא תקין (בקידוד פגום) ונשמרו שם כך. יש צורך להזין את הנתונים האלו מחדש כאשר השדות והקידוד מוגדרים נכון - שוב.
במקום כל מה שכתבת אפשר בהחלט להסתדר עם פונקציה אחת - mysql_set_charset.
מה ש mysql_set_charset עושה זה בדיוק את שאילתת ה set names (שהיא עצמה עושה את כל מה ששלושת השאילתות האלה עושות) לכן לרוב אין בהם צורך.
קרו מקרים שלי זה לא הפסיק מסיבות לא ברורות בלי שלושת השאילתות האחרונות באופן מפורש. אין לי הסבר למה, יש לי רק את הפתרון. יכול להיות שזהו באג של גרסאות ישנות.
תודה
כאשר אני שולף תוכן מהמסד, שמוגדר כUTF-8 וגם
כל הדפים UTF-8 ללא BOM כמובן .....
ואני משתמש בSUBSTR כדי לקצץ את הסטרינג,
האות האחרונה או הכמה אותיות האחרונות שיש במחרוזת החדשה, התהפכו פתאום לסימני שאלה ...
לא סימני שאלה כמו אלה ???
אלא עם רקע שחור מאחורה בצורה של יהלום.
מה לעשות ?
substr לא תומכת ב utf-8 ובכלל עד PHP 6 כל פונקציות המחרוזות לא מסתדרות עם utf-8 בצורה טובה. בשביל זה יש את ההרחבה multibyte ובה פונקציות כמו mb_substr שבאות לפתור בדיוק את הבעה הזו.
אני משתמש עכשיו עם mb_substr וזה עדיין לא עובד......
פתר לי את זה באופן חלקי .
יש אפשרות להמיר את המחרוזת לקידוד אחר, ואז לבצע SUBSTR
בלי כל הסימני םהאלה ?
יש אפשרות להעביר את השאלה לפורום ולהראות את הקוד.
אין את הבעיה הזו אצל mb_substr כשמעבירים לה את כל הפרמטרים.
לא צריך כאן אפילו קוד, אין בשביל מה כי זה ממש קצת .
אני שולף מהמסד קטע בעברית שכולל מספרים וסימנים וגם מילים בעברית .
מה שקורה אני חותך את זה עם SUBSTR ולפעמים בסוף זה מציג לי את הסימן שאלה הזה, הכל מקודד אצלי UTF-8 וראיתי שאני צריך לשים בפרמטר האחרוןקידוד, איזה לבחור ?
צריך. תגובות לכתבה זה לא מקום לפתור בעיות פרטניות.
הקידוד שצריך הוא הקידוד של הנתונים. utf-8 במקרה שלך.
כתוב בצורה בהירה ומובנת.
וואו, תודה רבה!. שעות נברתי בגוגלוחיפשתי פיתרון, לקח לי זמן להגיע לעמוד הזה, אבל תודה תודה!! סידרת לי את התחת.
להגדיר קידוד בחמישה מקומות.
^^^^^
כתבתה רק 4 מקומות
כתבתי רק 4 ספרות, אבל חמישה מקומות. בוא נראה כמה מהר אתה מוצא איפה יש שני מקומות תחת מיספור אחד.
פה?
<?php header('Content-Type: text/html; charset=utf-8'); ?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
בדיוק. אתה יכול לשים את שתי השורות האלה אחת אחרי השניה, אבל זה לא קורה בדרך כלל.
לפחות בגלל שתאורטית ביניהם אמורים להיות תגי html אחרים.
אני מבצע בחיבור setname לut8 ועדיין כל מה שאני מקבל הוא
ž×¤×¨×¥
עשיתי גם סט לוקל כלום לא עוזר...זו בעיה שפתאום צצה לפני כמה דקות הכל עבד רגיל..
תודה
תנסה
mysql_query("set character_set_client='utf8'");
mysql_query("set character_set_results='utf8'");
mysql_query("set collation_connection='utf8'");
תודה אלכס..
מסתבר שמה שהייתה הבעיה היא הכנסה של תווים למערך בצורה כזאת
$a=array(name=>$name)
כאשר אני מכניס בצורה כזאת זה מסתדר..
$a[name]="$name"..
עוד משהו .. איך יכול להיות שמחלקה שרצה ללא unset של המשתנים לוקחת פחות זכרון מuset ..
תודה
*לוקחת פחות זכרון מאותה המחלקה שבה אני דואג לעשות unset לכל משתנה לא נחוץ
הרי למחשב לוקח זמן לעשות unset
אם אתה לא עושה unset בעצמך - PHP תעשה אותו בעצמה אחרי שתסיים את הסקריפט (אבל זה כבר קורה אחרי שהטיימר שלך מפסיק לרוץ)
הגיוני אחלה
אחי , יפה כול הכבוד
על איזה פורום מדברים כאן בתגובות כל הזמן?! תפוז?
פעם באתר הזה היה פורום. היום מחליפה אותו מערכת שאלות-תשובות.
אני באתר שלי משתמש בקידוד ANSI אבל העורך עושה לי הצגה בUTF8 ככה שהוא ממיר את העיברית לANSI אוטומטית..
עדיף להישאר ככה או לעבור לUTF8
כמו שאומרים - עדיף לא לגעת במה שעובד.
ברגע שזה יפסיק לעבוד - יהיה עדיף לעבור ל utf-8
יש לי בעיה באתר י ש לי דף אינטרנט מסוים שכל יומיים נהפך לסימני שאלה במקום מילים ואני לא יודעת כבר מה לעשות יש לי את התגים של עברית אבל זה לא עוזר
אני כל יומיים מכניסה לשרת את הדף הספציפי הזה וכל יומיים זה חוזר לעצמו אשמח לעזרה אני עובדת עצות
רסקין, יא מלך.
ועוד לחשוב שפעם רצית לוותר על האתר הזה ולמסור (לי) אותו.
מצטט שאלה של מישהו אחר, "מה ההבדל בין header של קידוד לבין תגית meta ב-HTML?"
מצאתי את התשובה:
charset, כלומר זה של HTML - סט של תווים שאפשר לראות.
קידוד, כלומר זה של PHP - הדרך שבה התווים האלה מאוחסנים בזיכרון.